package com.raymond.thread.manager.once;

import com.raymond.thread.manager.BaseThread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;

/**
 * 单次任务线程任务
 * 重写init()方法,线程开始运行时,异常线程直接退出
 * 实现execute()方法,主体任务处理
 * 重写after()方法,线程退出的时候运行
 * @author :  raymond
 * @version :  V1.0
 * @date :  2020-09-11 14:11
 */
public abstract class BaseOnceThread extends BaseThread {
    private static final Logger logger = LoggerFactory.getLogger(BaseOnceThread.class);

    private long startTime;

    /**
     * 获取线程开始运行的时间
     * @return 开始运行的时间戳
     */
    public long getStartTime() {
        return startTime;
    }

    @Override
    public final void run() {
        super.run();
        init();
        try {
            execute();
        } catch (Exception e) {
            logger.error("一次任务线程异常,{}", getName(), e);
        }
        after();
    }

    /**
     * 初始化方法,当前线程启动运行一次
     */
    protected void init() {
        startTime = System.currentTimeMillis();
        logger.info("线程已开始执行,{},开始执行时间:{}", getName(), LocalDateTime.now());
    }

    /**
     * 线程关闭运行的方法
     */
    protected void after() {
        logger.info("线程执行结束,{},当前任务耗时:{}毫秒", getName(), System.currentTimeMillis() - this.startTime);
    }
    /**
     * 主体处理任务
     */
    protected abstract void execute();


}
